package com.example.demo;

import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.lang.reflect.Method;
import java.util.List;

class Student {
    private String name;
    private int age;
    private String gender;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }


    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}


@RestController
@RequestMapping("/begin")
public class helloController {

    @RequestMapping(value = "/hello" ,method = RequestMethod.POST)
    public  String hello() {
        return "I Love You";
    }


    /**
     * 传递时需要同名
     * @param name 名字
     * @return 该正文
     */

//    传递一个请求参数

    @RequestMapping("/param1")
    public String param1(@RequestParam(value = "name1", required = false) String name) {
        return "name: " + name;
    }





//    传递多个请求参数
    @RequestMapping("/param2")
    public String param2(String name , int age , String gender) {
        return "name: " + name  + "age: " + age + "gender: " + gender;
    }


//    传递对象
    /**
     *
     * 属性名也要和参数相同
     * @param student 传递对象
     * @return
     */
    @RequestMapping("/param3")
    public Student param3(Student student) {
        return student;
    }


    /**
     * 传集合 list
     * 需要用 RequestParam 来绑定将数组转化 list
     * @param list
     * @return
     */


    @RequestMapping("/param4")
    //  传集合
    public List<String> param4(@RequestParam List<String> list) {
        return  list;
    }


    /**
     * @ RequestParam 用来绑定一般的参数注解
     * 需要修改参数名， 就要在列表中加入原有的参数名进行绑定
     * 一般默认一个参数时 ， 填写的 value
     * required 一般为  true 代表一定要绑定的。
     * 对参数进行重命名
     * 参数绑定
     */
    @RequestMapping("/param5")

    public String param5(@RequestParam(value = "name",required = false) String paramName , @RequestParam int age) {
        return "paramName: " +  paramName +" age: " +  age ;
    }


    /**
     * 对数组进行传参
     */

    @RequestMapping("/param6")
    public List<String> param6(String[] names) {
        return List.of(names);
    }


    /**
     *
     * @RequestBody 表示用来修饰对象传递一个 JSON 格式的对象的注解
     * 传递一个 JSON 对象
     * @param student 对象
     * @return 返回该对象
     */
    @RequestMapping("/param7")
    public Student param7 (@RequestBody Student student) {
        return student;
    }


    /**
     * @PathVariable 是用来绑定 URL 路径的注解
     * {} 中代表特定含义的 URL的路径
     * @param UserId
     * @param type
     * @return
     */

//    获取URL 中的路径参数
    @RequestMapping("/param8/{id}/{type}")
    public  String param8(@PathVariable("id") String UserId , @PathVariable String type) {
        return "id: " + UserId + "  type: " + type;
    }

    // 获取文件信息

    /**
     * @RequestPart 这是用来绑定文件信息的注解
     * MultipartFile 用作接收 file 的类型
     * @param file 文件
     * @return 文件信息
     */
    @RequestMapping("/param9")
    public String param9(@RequestPart MultipartFile file) {
        return "file： " + file.getOriginalFilename();
    }


}
